#ifndef __BSW_DMA_H__
#define __BSW_DMA_H__

typedef enum DMA_CHn
{
    DMA_CH0 = 0,
    DMA_CH1,
    DMA_CH2, //mc33771 spi2 tx
    DMA_CH3, //mc33771 spi2 rx
    DMA_CH4, //w5500 spi1 tx
    DMA_CH5, //w5500 spi1 rx
    DMA_CH6, //i2c tx
    DMA_CH7, //i2c rx
    DMA_CH8, //uart1 rx
    DMA_CH9, //uart1 tx
    DMA_CH10, //uart0 rx
    DMA_CH11, //uart0 tx
    DMA_CH12, //can0
    DMA_CH13, //can1
    DMA_CH14, //can2
    DMA_CH15
}DMA_CHn;

/**********************************************************************************************************
DMA参数配置注意事项：
1.配置好数据源地址 和 目标地址 (目标地址不可以是FLASH)
2.单次传输的字节 和 自动累加的地址大小需要一直
3.DMA开启传输的字节大小不能小于 单次传输的字节大小
4.Major*Minor
***********************************************************************************************************/
typedef struct 
{
    u8                                          DMA_Ch;     /*配置DMA通道*/
                                                            /*eg: DMA_CH0*/
    IRQn_Type                                   IRQn;       /*S32_NVIC->ISER*/

    u32                                         SrcAddr;    /*TCD[channel].SADDR*/
                                                            /*配置源地址*/
                                                            /*     eg: (u32)Dma_Src*/
    u32                                         SrcOffset;  /*DMA->TCD[channel].SOFF*/
                                                            /*自动累加源地址大小*/
                                                            /*eg: 1 每次传输地址自动加1*/
    edma_transfer_size_t        SrcTrfSize;                 /*DMA->TCD[channel].ATTR.SSIZE*/
                                                            /*源地址单次传输几个字节*/
                                                            /*eg:	EDMA_TRANSFER_SIZE_1B */
    s32                         SrcLastAdj;                 /*DMA->TCD[channel].SLAST*/
                                                            /*配置传输完成时是否更改源地址              */
                                                            /*eg: 0 不更改源地址*/

    u32                                         DestAddr;   /*DMA->TCD[channel].DADDR*/
                                                            /*配置目标地址        eg: (u32)Dma_Dest*/
    u32                                         DestOffset; /*DMA->TCD[channel].DOFF*/
                                                            /*自动累加目标地址大小*/
                                                            /*eg: 1 每次传输地址自动加1*/
    edma_transfer_size_t        DestTrfSize;                /*DMA->TCD[channel].ATTR.DSIZE*/
                                                            /*目标地址单次传输几个字节*/
                                                            /*eg:EDMA_TRANSFER_SIZE_1B */
    s32                                         DestLastAdj;/*DMA->TCD[channel].DLASTSGA */
                                                            /*adds an adjustment value added to the source address 
                                                              at the completion of the major iteration count*/
                                                            /*配置传输完成时是否更改目标地*/
                                                            /*eg: 0 不更改目标地址			*/

    u32                                         SetNbytes;  /*DMA->TCD[channel].NBYTES.MLNO SMLOE=0且DMLOE=0*/
                                                            /*Minor iteration count:DMA开启每次传输几个字节*/
                                                            /*eg: 1  每次传输1个字节*/
    u32                                         SetMjrCount;/*DMA->TCD[channel].BITER.ELINKYES*/
                                                            /*DMA->TCD[channel].CITER.ELINKYES*/
                                                            /*Major iteration count:Sets the major iteration count according to minor loop*/
                                                            /*DMA开启每次循环的次数*/
                                                            /*eg: 10 每次传输多少次			*/
    bool                                        b_MjrCpltIrq;/*base->TCD[channel].CSR.INTMAJOR*/
                                                             /*主计数器一半后产生中断*/
    bool                                        b_HlfCpltIrq;/*base->TCD[channel].CSR.INTHALF*/
                                                             /*主计数器结束后产生中断*/
    bool                                        b_DmaRqstDone;/*DMA->TCD[CHn].DREQ 使能DMA硬件请求(DMA_TCD_CSR_DREQ)*/
                                                             /*传输结束是否自动关闭DMA*/
                                                             /*eg: true 自动关闭DMA 			*/
    bool                                        b_Dma_En;    /*1.DMA->SERQ enable DMA channel n HW trigger*/
                                                             /*0.DMA->CERQ disable DMA channel n HW trigger*/
                                                             /* DMA使能配置*/
                                                             /*eg: true 使能DMA触发传输*/
}BSW_Dma_Cfg;




void BSW_EDMA_INIT(void);



void BSW_DMA_INIT_CFG(BSW_Dma_Cfg Dma_Cfg);

void BSW_DMAMUX_INIT(u8 Dma_Ch,u8 DmaMux_Soc);


void BSW_DMA_START(uint8_t DMA_CHn);
void BSW_DMA_STOP(uint8_t DMA_CHn);
/*主的计数次数（major iteration count）达到后重新更改目标地址*/
void BSW_DMA_DestLastAdjust(uint8_t DMA_CHn,uint16_t Ajust_Byte);
/*主的计数次数（major iteration count）达到后，是否重新更改源地址*/
void BSW_DMA_SrcLastAdjust(uint8_t DMA_CHn,uint16_t Ajust_Byte);
/*********重新启动DMAINIT**********/
void BSW_DMA_REINIT(uint8_t DMA_CHn,uint32_t SourceAddr,uint32_t TargetAddr ,uint16_t Send_Buff_Byte);
/*********下次传输初始化**********/
void BSW_DMA_NEXT_INIT(uint8_t DMA_CHn,uint32_t TargetAddr,uint16_t Send_Buff_Byte);

#endif
